package util;


import java.util.Arrays;
import java.util.Date;
import java.util.List;


/**
* システム共通部品で利用するパラメータを保持します。 設定は"SystemSetting.properties"ファイルに行います。
* 設定値の種類・内容は"SystemSetting.properties"ファイルを参照してください。
* 
* @author NDSS fushimi
*/
public class SystemSettingUtil
{

   // 内部で保持するプロパティ
   private static CustomExtendedProperties properties;

   // デフォルトのプロパティファイル名
   public static final String PROPERTY_FILE_NAME = "system-setting.properties";

   //キャッシュ保持期間
   private static long ttl;

   //前回読み込み時刻
   private static Date loadTime;

   //再読み込みインターバル（デフォルトは無限大＝リロード無し）
   private static final long DEFAULT_TTL = -1L;

   static
   {
       properties = new CustomExtendedProperties( PROPERTY_FILE_NAME );
       ttl = properties.getLong( "ndss.resource.systemsetting.ttl", DEFAULT_TTL );
       loadTime = new Date();
   }


   private static CustomExtendedProperties getProperties()
   {
       if ( needsReload() )
       {
           properties = new CustomExtendedProperties( PROPERTY_FILE_NAME );
           loadTime = new Date();
       }

       return properties;
   }


   private static boolean needsReload()
   {
       Date now = new Date();
       return now.getTime() - loadTime.getTime() >= ttl;
   }


   /**
    * 指定したキーを持つ設定値を文字列で取得する
    * @param key キー
    * @return 設定値
    */
   public static String getString( String key )
   {
       return getProperties().getString( key );
   }


   /**
    * 指定したキーを持つ設定値を文字列で取得する。<br>
    * 指定したキーが存在しなかった場合は、指定したデフォルト値が取得される。
    * @param key キー
    * @param defaultValue キーが存在しなかった場合のデフォルト値
    * @return 設定値（存在しなかった場合は指定したデフォルト値）
    */
   public static String getString( String key, String defaultValue )
   {
       return getProperties().getString( key, defaultValue );
   }


   /**
    * 指定したキーを持つ設定値を文字列の配列で取得する。<br>
    * 設定値は、同一のキーを持たせることで、配列として定義可能
    * @param key キー
    * @return 設定値
    */
   public static String[] getStringArray( String key )
   {
       return getProperties().getStringArray( key );
   }

   /**
    * 指定したキーを持つ設定値を文字列の<code>List</code>で取得する。<br>
    * 設定値は、同一のキーを持たせることで、配列として定義可能
    * @param key キー
    * @return 設定値
    */
   public static List<String> getStringList( String key )
   {
       return Arrays.asList( getProperties().getStringArray( key ) );
   }

   /**
    * 指定したキーを持つ設定値を<code>int</code>で取得する
    * @param key キー
    * @return 設定値
    */
   public static int getInt( String key )
   {
       return getProperties().getInt( key );
   }

   /**
    * 指定したキーを持つ設定値を<code>int</code>で取得する。<br>
    * 指定したキーが存在しなかった場合は、指定したデフォルト値が取得される。
    * @param key キー
    * @param defaultValue キーが存在しなかった場合のデフォルト値
    * @return 設定値（存在しなかった場合は指定したデフォルト値）
    */
   public static int getInt( String key, int defaultValue )
   {
       return getProperties().getInt( key, defaultValue );
   }

   /**
    * 指定したキーを持つ設定値を<code>long</code>で取得する
    * @param key キー
    * @return 設定値
    */
   public static long getLong( String key )
   {
       return getProperties().getLong( key );
   }

   /**
    * 指定したキーを持つ設定値を<code>long</code>で取得する。<br>
    * 指定したキーが存在しなかった場合は、指定したデフォルト値が取得される。
    * @param key キー
    * @param defaultValue キーが存在しなかった場合のデフォルト値
    * @return 設定値（存在しなかった場合は指定したデフォルト値）
    */
   public static long getLong( String key, long defaultValue )
   {
       return getProperties().getLong( key, defaultValue );
   }

   /**
    * 指定したキーを持つ設定値を<code>boolean</code>で取得する<br>
    * <code>boolean</code>として取得可能な値は yes/no, true/false, on/off のいずれか。
    * @param key キー
    * @return 設定値
    */
   public static boolean getBoolean( String key )
   {
       return getProperties().getBoolean( key );
   }

   /**
    * 指定したキーを持つ設定値を<code>coolean</code>で取得する。<br>
    * <code>boolean</code>として取得可能な値は yes/no, true/false, on/off のいずれか。<br>
    * 指定したキーが存在しなかった場合は、指定したデフォルト値が取得される。
    * @param key キー
    * @param defaultValue キーが存在しなかった場合のデフォルト値
    * @return 設定値（存在しなかった場合は指定したデフォルト値）
    */
   public static boolean getBoolean( String key, boolean defaultValue )
   {
       return getProperties().getBoolean( key, defaultValue );
   }
}

